package com.cskaoyan.catmall.service.Impl.czx.wx;

import com.cskaoyan.catmall.dao.WxCouponMapper;
import com.cskaoyan.catmall.dao.WxCartDao;
import com.cskaoyan.catmall.model.bo.AddGoodToCartBo;
import com.cskaoyan.catmall.model.bo.ProductBo;
import com.cskaoyan.catmall.model.bo.UpdateProductBo;
import com.cskaoyan.catmall.model.vo.CheckVo;
import com.cskaoyan.catmall.model.vo.czx.wx.CartVo;
import com.cskaoyan.catmall.service.czx.wx.WxCartService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @Author: 逍遥子
 * @Date: 2022/01/11/10:07
 * @Description:
 */
@Service
public class WxCartServiceImpl implements WxCartService {

    @Autowired
    WxCartDao wxCartDao;

    @Autowired
    WxCouponMapper wxCouponMapper;

    /**
     * @description 根据用户id查询购物车中的商品信息
     * @author czx
     * @date 2022-01-11 16:06
     * @param
     * @return com.cskaoyan.catmall.model.vo.czx.wx.CartVo
     */
    @Override
    public CartVo selectCart() {

        Integer userId = 1;

        Integer statusId = 0;  // 0代表查询商品信息(包括选中和未选中...)

        // 购物车列表信息
        List<CartVo.CartListDTO> cartListDTOS = wxCartDao.selectCart(userId, statusId);

        // 遍历商品列表, 计算商品数量以及商品总额
        double goodsAmount = 0;
        Integer goodsCount = 0;
        for (CartVo.CartListDTO cartListDTO : cartListDTOS) {

            goodsAmount += cartListDTO.getPrice() * cartListDTO.getNumber();
            goodsCount += cartListDTO.getNumber();

        }

        // 再次查询计算购物车商品选中状态下数量以及商品总额
        List<CartVo.CartListDTO> cartListDTOS1 = wxCartDao.selectCart(userId, 1);

        double checkedGoodsAmount = 0;
        Integer checkedGoodsCount = 0;
        for (CartVo.CartListDTO cartListDTO : cartListDTOS1) {

            checkedGoodsAmount += cartListDTO.getPrice() * cartListDTO.getNumber();
            checkedGoodsCount += cartListDTO.getNumber();

        }

        // 封装视图层返回值
        CartVo cartVo = new CartVo();
        cartVo.setCartList(cartListDTOS);
        CartVo.CartTotalDTO cartTotalDTO = new CartVo.CartTotalDTO(goodsCount, checkedGoodsCount, goodsAmount, checkedGoodsAmount);
        cartVo.setCartTotal(cartTotalDTO);

        return cartVo;
    }

    /**
     * @description 逻辑删除购物车中的商品
     * @author czx
     * @date 2022-01-11 16:05
     * @param
     * @param productBo
     * @return int
     */
    @Override
    public int deleteProduct(ProductBo productBo) {
        return wxCartDao.deleteProduct(productBo.getProductIds());
    }

    /**
     * @description 更新购物车商品数量
     * @author czx
     * @date 2022-01-11 16:43
     * @param
     * @param updateProductBo
     * @return int
     */
    @Override
    public int updateProduct(UpdateProductBo updateProductBo) {
        return wxCartDao.updateProduct(updateProductBo);
    }

    /**
     * @description 添加商品到购物车
     * @author czx
     * @date 2022-01-11 17:03
     * @param
     * @param addGoodToCartBo
     * @return int
     */
    @Override
    public int insertProductToCart(AddGoodToCartBo addGoodToCartBo) {

        // 先根据商品id查找商品信息
        AddGoodToCartBo addGoodToCartBo2 = wxCartDao.selectGoodById(addGoodToCartBo.getGoodsId());
        return wxCartDao.insertProductToCart(addGoodToCartBo2, 1, addGoodToCartBo.getNumber());

    }

    /**
     * @description 查询用户购物车商品数量
     * @author czx
     * @date 2022-01-11 19:01
     * @param
     * @return int
     */
    @Override
    public int selectCartGoodNum() {
        // 购物车商品列表信息
        List<CartVo.CartListDTO> cartListDTOS = wxCartDao.selectCart(1, 0);
        return cartListDTOS.size();
    }

    /**
     * @description 更新购物车商品是否选中...
     * @author czx
     * @date 2022-01-11 19:23
     * @param
     * @param productId
     * @return int
     */
    @Override
    public CartVo updateCartGoodStatus(Integer productId, Integer statusId) {
        // 更新状态
        wxCartDao.updateCartGoodStatus(productId, statusId, 1);
        return selectCart();
    }

    /**
     * @description 快速添加商品到购物车...
     * @author czx
     * @date 2022-01-11 20:01
     * @param
     * @return int
     */
    @Override
    public int fastAddGoodToCart(AddGoodToCartBo addGoodToCartBo){
        // 先根据商品id查找商品信息
        AddGoodToCartBo addGoodToCartBo2 = wxCartDao.selectGoodById(addGoodToCartBo.getGoodsId());
        // 添加商品到购物车
        wxCartDao.insertProductToCart(addGoodToCartBo2, 1, addGoodToCartBo.getNumber());
        // 返回用户购物车商品数量
        List<CartVo.CartListDTO> cartListDTOS = wxCartDao.selectCart(1, 0);
        return cartListDTOS.size();
    }

    /**
     * @description 下单前状态检查
     * @author czx
     * @date 2022-01-11 20:44
     * @param
     * @param addressId
     * @param couponId
     * @param userCouponId
     * @return com.cskaoyan.catmall.model.vo.CheckVo
     */
    @Override
    public CheckVo checkStatus(Integer addressId, Integer couponId, Integer userCouponId) {

        // 用户购物车商品列表
        CartVo cartVo = selectCart();
        // 地址信息
        CheckVo.CheckedAddressDTO checkedAddressDTO = wxCartDao.selectAddress(addressId);
        // 优惠券金额
        Double money = wxCouponMapper.selectCouponAmountById(couponId);
        if(money == null){
            money = 0.0;
        }
        // 封装视图返回对象
        CheckVo checkVo = new CheckVo();
        List<CartVo.CartListDTO> cartList = cartVo.getCartList();

        double amount = 0;
        double freightPrice = 0;

        if(cartList.size() != 0){
            for (CartVo.CartListDTO cartListDTO : cartList) {
                amount += cartListDTO.getPrice() * cartListDTO.getNumber();
            }
            // 商品总价小于88, 运费+10
            if(amount < 88){
                freightPrice = 10;
                amount += freightPrice;
            }
        }

        // 商品的实际价格 总额 + 运费 - 优惠卷
        Double actualPrice = amount + freightPrice - money;

        checkVo.setCheckedGoodsList(cartList);
        checkVo.setCheckedAddress(checkedAddressDTO);
        checkVo.setAddressId(addressId);
        checkVo.setActualPrice(actualPrice);
        checkVo.setGoodsTotalPrice(amount);
        checkVo.setOrderTotalPrice(actualPrice);
        checkVo.setUserCouponId(couponId);

        return checkVo;
    }


}
